home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / 8087.arc / SIN.ASM < prev    next >
Encoding:
Assembly Source File  |  1985-02-13  |  1.9 KB  |  95 lines

  1.        PAGE    ,132
  2.     TITLE    Sine computation
  3. IF1
  4. INCLUDE 87MAC.LIB
  5. ENDIF
  6. STACK    SEGMENT STACK
  7.     DW    64 DUP(?)
  8. STACK    ENDS
  9. CODE    SEGMENT PUBLIC
  10.     ASSUME    CS:CODE,DS:CODE,ES:CODE
  11.     EXTRN    FLOAT_ASCII:NEAR
  12. NUM_ANGLE    DW    1
  13. DEN_ANGLE    DW    2
  14. STATUS    DW    ?
  15. FOUR    DW    4
  16. ten6    dd    1000000
  17. C3    EQU    40H
  18. C2    EQU    04H
  19. C1    EQU    02H
  20. C0    EQU    01H
  21. ERROR_MSG    DB    'Angle is too large',10,13,'$'
  22. SIN    PROC    FAR
  23.     PUSH    DS
  24.     SUB    AX,AX
  25.     PUSH    AX
  26.     MOV    AX,CS
  27.     MOV    DS,AX
  28.     MOV    ES,AX
  29. DO_AGAIN:
  30.     FINIT            ;------ST0------;-----ST1-------
  31.     FILD    NUM_ANGLE    ;        ;
  32.     FIDIV    DEN_ANGLE    ;  X= ANGLE    ;
  33.     FLDPI            ;     PI    ;    X
  34.     FIDIV    FOUR        ;   PI/4    ;    X
  35.     FXCH            ;     X     ;     PI/4
  36.     FPREM            ;     R     ;     PI/4
  37.     FSTSW    STATUS
  38.     FWAIT
  39.     MOV    AH,BYTE PTR STATUS+1
  40.     TEST    AH,C2
  41.     JNZ    BIG_ANGLE
  42.     TEST    AH,C1        ; Determine if pi/4 subtract needed
  43.     JZ    DO_R        ; If zero, then no subtract
  44.     FSUBRP    ST1,ST0     ; A=PI/4-R    ;    ?
  45.     JMP    SHORT DO_FPTAN
  46. DO_R:
  47.     FXCH            ;     PI/4    ;    R
  48.     FCOMP            ;    R    ;    ?
  49. DO_FPTAN:
  50.     FPTAN            ;      OPP    ;      ADJ where OPP/ADJ=TAN(A)
  51.  
  52. ;------ Determine if sin or cos required
  53.  
  54.     TEST    AH,C3 OR C1    ; Look at both
  55.     JPE    DO_SINE
  56.     FXCH            ;      ADJ    ;      OPP
  57. DO_SINE:            ;    D    ;    N
  58.  
  59. ;------ Calculate N/SQR(N**2 + D**2)
  60.  
  61.     FMUL    ST0        ;     D**2    ;    N
  62.     FXCH    ST1        ;      N    ;     D**2
  63.     FLD    ST0        ;      N    ;    N    ;      D**2
  64.     FMUL    ST0        ;     N**2    ;    N    ;      D**2
  65.     FADD    ST2        ; N**2+D**2    ;    N    ;      D**2
  66.     FSQRT            ;SQR(N2+D2)    ;    N    ;      D**2
  67.     FDIVRP    ST1        ;  SIN(X)    ;     D**2
  68.     FXCH    ST1        ;    D**2    ;     SIN(X)    ;
  69.     FCOMP            ;   SIN(X)
  70.     TEST    AH,C0
  71.     JZ    SIGN_OK
  72.     FCHS
  73. SIGN_OK:
  74.     CALL    FLOAT_ASCII
  75.     INC    NUM_ANGLE
  76.     CMP    NUM_ANGLE,13
  77.     JA    RETURN_INST
  78.     JMP    DO_AGAIN
  79. RETURN_INST:
  80.     RET
  81. BIG_ANGLE:
  82.     MOV    DX,OFFSET ERROR_MSG
  83.     MOV    AH,9
  84.     INT    21H
  85.     RET
  86.     org    200h
  87. bcd_temp    dt    ?
  88.     org    210h
  89.     fimul    ten6
  90.     fbstp    bcd_temp
  91.     int    3
  92. SIN    ENDP
  93. CODE    ENDS
  94.     END    SIN
  95.